function sudoku_genere = generation()

% Permet la generation d'un sudoku plein pouvant etre vide.

cube = ones(9, 9, 9);
sudoku_genere = zeros(9);


% On insere les chiffres (1 a 9) aleatoirement dans les lignes.
for i = 1:9
	% Liste contenant les differentes possibilites deja mises dans la ligne
	L = {};
	for j = 1:9
		bon = false;
		while ~bon
			bon = true;
			l = 1;
			k = round(rand*8 + 1);
			% On regarde si le nombre genere a deja ete utilise.
			while (l <= size(L, 2) && bon == true)
				if (k == L{1, l})
					bon = false;
				end
				l = l + 1;
			end
		end
		% S'il n'est pas utilise on le rajoute dans le sudoku et on le met dans notre liste.
		sudoku_genere(i, j) = k;
		L = [k L];
	end
end


% On se retrouve avec un sudoku ayant les lignes correctes mais le reste normalement non.

% Calcul de l'erreur :

critere = Calcul_Critere_Generation(sudoku_genere);

% On tourne tant que le critère n'est pas nul. Ce qui correspond à avoir fini le sudoku.
while (critere ~= 0)
% i1 : indice de la ligne où on va permuter des cases.
	i1 = round(rand*8 + 1);
	j1 = round(rand*8 + 1);
	j2 = round(rand*8 + 1);
	while j1 == j2
		i1 = round(rand*8 + 1);
		j1 = round(rand*8 + 1);
		j2 = round(rand*8 + 1);
	end

	k1 = sudoku_genere(i1, j1);
	k2 = sudoku_genere(i1, j2);
	sudoku_temp = sudoku_genere;
	sudoku_temp(i1, j1) = k2;
	sudoku_temp(i1, j2) = k1;
	critere_temp = Calcul_Critere_Generation(sudoku_temp);
	if (critere_temp <= critere)
		sudoku_genere = sudoku_temp;
		critere = critere_temp;
	end
end

return;
